package com.dt.zbcy.provider.core.shiro;

import com.dt.zbcy.provider.web.entity.MjzUserInfoEntity;
import com.dt.zbcy.provider.web.service.IMjzUserInfoService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.crazycake.shiro.SerializeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Resource;

/**
 * @Auther: liuwenxiang
 * @Date: 2018/12/20 15:43
 * @Description:
 */
public class ShiroRealm extends AuthorizingRealm {

    private final static Logger logger = LoggerFactory.getLogger(ShiroRealm.class);

   /* @Resource
    private UserService userService;

    @Resource
    private IResourceService resourceService;
*/

   @Autowired
   private IMjzUserInfoService userInfoService;

    /**
     * doGetAuthenticationInfo()是用户认证：
     *      1.登陆时，访问此方法
     *      2.让shiro进行密码验证
     *
     *   （将此用户存放到登录认证SimpleAuthenticationInfo中，无需自己做密码对比，Shiro会为我们进行密码对比校验）
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)
            throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        MjzUserInfoEntity user =  userInfoService.selectUserByUserName(token.getUsername());
        SecurityUtils.getSubject().getSession().setAttribute("user", SerializeUtils.serialize(user));//缓存用户
        return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
    }




    /**
     *  doGetAuthorizationInfo()是权限控制：
     *       1.访问设置了权限的方法时，访问此方法.
     *       2.让shiro进行权限验证，这个方法是返回用户的权限信息，交给shiro与访问的方法上的权限做匹配。
     *
     *      （当访问到页面的时候，使用了相应的注解或者shiro标签才会执行此方法否则不会执行，
     *      此方法返回的内容是该用户所包含的角色和权限，用于与用户访问方法上的权限做匹配，这个匹配逻辑shiro内部已实现
     *      所以如果只是简单的身份认证没有权限的控制的话，那么这个方法可以不进行实现，直接返回null即可
     *      （返回null将会导致用户访问任何被拦截的请求时都会自动跳转到unauthorizedUrl指定的地址））
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        logger.info("鉴权doGetAuthorizationInfo:" + principalCollection.getPrimaryPrincipal());
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();


        return info;

    }

}
